package pe.org.manuela.app.ui

import groovy.swing.*
import java.awt.*
import javax.swing.*
import javax.swing.border.*
import javax.swing.table.*
import pe.org.manuela.app.despachadores.*


static def cargar(sw) {
	
	def obtenerTipoProducto = {
		def tipos = TipoProductoDespachador.obtenerTipoProducto()
		tipos.each {
			sw.cboTipoProducto.addItem(it)
		}
	}
	
	def obtenerProductosPorTipo = {
		e ->
		def params = [:]
		params.tipoProducto = e.source.selectedItem.id
		def data = ProductoDespachador.obtenerProductosPorTipo(params)
		sw.cboProducto.removeAllItems()
		data.each {
			sw.cboProducto.addItem(it.descripcion)
		}
	}
	
	def obtenerTallasPorProducto = {
		e ->
		def params = [:]
		params.tipoProducto = sw.cboTipoProducto.selectedItem.id
		params.producto = e.source.selectedItem
		def data = TallaDespachador.obtenerTallasPorProducto(params)
		sw.cboTalla.removeAllItems()
		data.each {
			sw.cboTalla.addItem(it)
		}
	}
	
	def obtenerInsumosPorTalla = {
		e ->
		def params = [:]
		params.tipoProducto = sw.cboTipoProducto.selectedItem.id
		params.producto = sw.cboProducto.selectedItem
		params.talla = e.source.selectedItem?.id
		def data = InsumoDespachador.obtenerInsumosPorTalla(params)
		def insumos = InsumoDespachador.obtenerInsumos()
		insumos = insumos.findAll {
			insumo ->
			def encontro = false
			data.each {
				encontro = it.id == insumo.id
			}
			return !encontro
		}
		def tm = sw.grdInsumosProducto.model
		tm.rowCount = 0
		data.each {
			tm.addRow([it, 0, new Unidad(id: 1, abreviatura: "m")] as Object[])
		}
		tm = sw.grdInsumos.model
		tm.rowCount = 0
		insumos.each {
			tm.addRow([it] as Object[])
		}
	}
	
	def agregarInsumo = {
		def origen = sw.grdInsumos.getValueAt(sw.grdInsumos.selectedRow, 0)
		sw.grdInsumosProducto.model.addRow([origen, 0, new Unidad()] as Object[])
		sw.grdInsumos.model.removeRow(sw.grdInsumos.selectedRow)
	}
	
	def eliminarInsumo = {
		def origen = sw.grdInsumosProducto.getValueAt(sw.grdInsumosProducto.selectedRow, 0)
		sw.grdInsumos.model.addRow([origen] as Object[])
		sw.grdInsumosProducto.model.removeRow(sw.grdInsumosProducto.selectedRow)
	}
	
	def frmProductoInsumo = sw.internalFrame(
		id: "frmProdctoInsumo",
		closable: true,
		iconifiable: true,
		maximizable: true,
		defaultCloseOperation: JFrame.DISPOSE_ON_CLOSE
	){
			def borde = BorderFactory.createEtchedBorder(EtchedBorder.RAISED)
			panel(
				constraints: BorderLayout.NORTH,
				border: BorderFactory.createTitledBorder(borde, "Seleccionar Tipo Producto / Producto / Talla")
			) {
				boxLayout(axis: BoxLayout.X_AXIS)
				comboBox(
					id: "cboTipoProducto",
					preferredSize: [150, 20],
					itemStateChanged: {
						e ->
						Thread.start {
							obtenerProductosPorTipo(e)
						}
					}
				)
				panel preferredSize: [5, 0]
				comboBox(
					id: "cboProducto",
					preferredSize: [300, 20],
					itemStateChanged: {
						e ->
						Thread.start {
							obtenerTallasPorProducto(e)
						}
					}
				)
				panel preferredSize: [5, 0]
				comboBox(
					id: "cboTalla",
					preferredSize: [120, 20],
					itemStateChanged: {
						e ->
						Thread.start {
							obtenerInsumosPorTalla(e)
						}
						
					}
					
				)
				panel preferredSize: [5, 0]
			}
			panel(
				constraints: BorderLayout.CENTER
			) {
				boxLayout(axis: BoxLayout.X_AXIS)
				scrollPane(
					border: BorderFactory.createTitledBorder(borde, "Lista de Insumos General"),
					preferredSize: [300, 100]
				){
					def columnas = ["Insumo"] as String[]
					def tm = new DefaultTableModel(columnas, 0)
					table(id: "grdInsumos", model: tm)
				}
				panel preferredSize: [10, 0]
				panel(preferredSize: [140, 300]) {
					boxLayout(axis: BoxLayout.Y_AXIS)
					panel preferredSize: [0, 100]
					panel() {
						gridLayout(rows: 2, columns: 1, hgap: 10, vgap: 10)
						button(text: "Agregar >>", actionPerformed: {
							agregarInsumo()
						})
						button(text: "<< Eliminar", actionPerformed: {
							eliminarInsumo()
						})
					}
					panel preferredSize: [0, 300]					
				}
				panel preferredSize: [10, 0]
				scrollPane(
					border: BorderFactory.createTitledBorder(borde, "Lista de Insumos del Producto"),
					preferredSize: [300, 100]
				){
					def columnas = ["Insumo", "Cantidad", "Unidad"] as String[]
					def tm = new AsociacionProductoInsumoProductoInsumoTableModel(columnas, 0)
					table(id: "grdInsumosProducto", model: tm)
				}
			}
			panel(constraints: BorderLayout.SOUTH) {
				button("Grabar")
				button("Cerrar")
			}
	}
	
	
	
	def cboUnidades = new JComboBox()
	def unidades = UnidadDespachador.obtenerUnidades()
	unidades.each {
		cboUnidades.addItem(it)
	}
	sw.grdInsumosProducto.columnModel.getColumn(2).cellEditor = new DefaultCellEditor(cboUnidades) 
	
	frmProductoInsumo.pack()
	frmProductoInsumo.visible = true
	sw.escritorio << frmProductoInsumo
	Thread.start {
		obtenerTipoProducto()
	}
}

class AsociacionProductoInsumoProductoInsumoTableModel extends DefaultTableModel {
	public AsociacionProductoInsumoProductoInsumoTableModel(Object[] columns, int rows) {
		super(columns, rows)
	}
	
	public boolean isCellEditable(int row, int column) {
		switch(column) {
			case 0:
				return false
			break
			case 1:
				return true
				break
			default:
				return true
		}
	}
}

